package com.design.patterns.behavioralModel.abstractFactory;

import com.design.patterns.behavioralModel.abstractFactory.factory.AbstractFactory;
import com.design.patterns.behavioralModel.abstractFactory.porduct.HtmlDocument;
import com.design.patterns.behavioralModel.abstractFactory.porduct.WordDocument;
import com.design.patterns.behavioralModel.abstractFactory.supplier.AbstractFactoryImpl;

/**
 * 抽象工厂模式
 * 目的：提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类
 * 是一个比较复杂的创建型模式
 * 与工厂方法的区别：解决的问题比较复杂，不但工厂是抽象的，而且有多个产品需要创建，因此，抽象工厂对应多个实际工厂，每个实际工厂负责创建多个实际产品
 * 我们新增抽象工厂：AbstractFactory，去抽象创建过程
 * 我们新增对应需要创建的产品：也是抽象出来HtmlDocument，WordDocument
 * 然后我们去实现抽象工厂和抽象的实际操作，等我们需要去替换产品时只需要去切换对应实现，而不需要去更改流程代码
 * 以下时流程的具体使用情况
 */
public class AbstractFactoryMain {
    public static void main(String[] args) {
        /**
         * 我们使用我们实现的AbstractFactoryImpl工厂，实现低耦合
         */
        AbstractFactory abstractFactory = new AbstractFactoryImpl();
        /**
         * 创建对应的产品
         * 因为我们在上面实现的抽象工厂，那么我们现在创建的产品就是对应的实现后工厂的产品
         * 如下
         */
        HtmlDocument html = abstractFactory.createHtml();
        WordDocument word = abstractFactory.createWord();
        /**
         * 使用产品
         * 当我们想要其他的AbstractFactoryImpl时，我们只需要去实现abstractFactory并且去实现对应产品的业务逻辑HtmlDocument，WordDocument就行
         * 不用去动现在使用的流程代码
         */
        System.out.println(html.toHtml());
        System.out.println(word.toWord());
    }

}
